/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package basedatos;

import genericos.Cambio;
import genericos.ListaNodos;
import genericos.Grid;
import genericos.Grid2;
import genericos.Grid3;
import genericos.Insercion;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author residentene
 */
public class Algcal {

    /**
     * Variables de inicializacion
     */
    //Pool de conexiones
    static Pool p = new Pool();
    //Objeto de insercion
    static Insercion in = new Insercion();
    //Objeto de cambio
    private static Cambio c = new Cambio();

    /**
     * Metodo que retira un objetivo de colaborador de la tabla objcol
     *
     * @param id id del objetivo a borrar
     */
    public static void quitarobjcol(int id) {
        Connection conn = null;
        String sql = "delete from objcol where id=?";
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            int n = pst.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();

        } finally {
            try {
                pst.clearParameters();
                pst.close();
                p.liberarConexion(conn);
                System.gc(); //Recoleccion de objetos que no son usados.
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
    }

    /**
     * Metodo que elimina un objetivo de mando medio
     *
     * @param id id del objetivo a borrar.
     */
    public static void quitarobjmm(int id) {
        Connection conn = null;
        String sql = "delete from objmm where id=?";
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            int n = pst.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();

        } finally {
            try {
                pst.clearParameters();
                pst.close();
                p.liberarConexion(conn);
                System.gc(); //Recoleccion de objetos que no son usados.
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
    }

    /**
     * Metodo del que borra un objetivo de director
     *
     * @param id id del objetivo de director
     */
    public static void quitarobjdire(int id) {
        Connection conn = null;
        String sql = "delete from obdirector where id=?";
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            int n = pst.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();

        } finally {
            try {
                pst.clearParameters();
                pst.close();
                p.liberarConexion(conn);
                System.gc(); //Recoleccion de objetos que no son usados.
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
    }

    /**
     * Metodo que retira un objetivo de direccion
     *
     * @param id id del objetivo de direccion
     */
    public static void quitarobjdir(int id) {
        Connection conn = null;
        String sql = "delete from objcol where idobjdir=?";
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            int n = pst.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();

        } finally {
            try {
                pst.clearParameters();
                pst.close();
                p.liberarConexion(conn);
                System.gc(); //Recoleccion de objetos que no son usados.
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
    }

    /**
     * Metodo que retira una tactica del plan
     *
     * @param id id de la tactica a mover.
     */
    public static void quitartac(int id) {
        Connection conn = null;
        String sql = "delete from tactica where idtac=?";
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            int n = pst.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();

        } finally {
            try {
                pst.clearParameters();
                pst.close();
                p.liberarConexion(conn);
                System.gc(); //Recoleccion de objetos que no son usados.
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
    }
    //Calificaciones
    /**
     * Metodo que inserta un objetivo de colaborador cuando este objetivo no fue
     * terminado el semestra anterior
     *
     * @param idobj id del objetivo anterior
     * @param ced id del la cedula a revisar
     * @return id del nuevo registro.
     */
    public static int inserta_obcol(int idobj, int ced) {
        int id = 0;
        Grid2 g = datoscol(idobj);
        int[] cal = banderas.trimrecorrido(Seleccion.calculatrimestre());
        ListaNodos.agregainsert("nombre", g.getNombre());
        ListaNodos.agregainsert("descripcion", g.getDescripcion());
        ListaNodos.agregainsert("comcol", g.getComcol());
        ListaNodos.agregainsert("comjefe", g.getComjefe());
        ListaNodos.agregainsert("objefe", g.getLiga());
        ListaNodos.agregainsert("resultado", g.getResultado());
        ListaNodos.agregainsert("cedula", ced);
        ListaNodos.agregainsert("estado", "En Revisión");
        ListaNodos.agregainsert("trimestre", cal[0]);
        ListaNodos.agregainsert("aregistro", cal[1]);
        in.insertanuevo(ListaNodos.conversion_inser(), "objcol");
        id = in.getId();
        ListaNodos.borradoinser();
        System.out.println("El registro nuevo es " + id);
        return id;
    }

    /**
     * Metodo que inserta un objetivo de mando medio que no fue cumplido el
     * trimestre anterior
     *
     * @param idobj id del objetivo anterior
     * @param ced id de la cedula
     * @return id del nuevo registro
     */
    public static int inserta_obmm(int idobj, int ced) {
        int id = 0;

        Grid2 g = datosmm(idobj);
        int[] cal = banderas.trimrecorrido(Seleccion.calculatrimestre());
        ListaNodos.agregainsert("nombre", g.getNombre());
        ListaNodos.agregainsert("descripcion", g.getDescripcion());
        ListaNodos.agregainsert("comcol", g.getComcol());
        ListaNodos.agregainsert("comjefe", g.getComjefe());
        ListaNodos.agregainsert("objdir", g.getLiga());
        ListaNodos.agregainsert("resultado", g.getResultado());
        ListaNodos.agregainsert("cedula", ced);
        ListaNodos.agregainsert("estado", "En Revisión");
        ListaNodos.agregainsert("trimestre", cal[0]);
        ListaNodos.agregainsert("aregistro", cal[1]);
        in.insertanuevo(ListaNodos.conversion_inser(), "objmm");
        id = in.getId();
        ListaNodos.borradoinser();
        System.out.println("El registro nuevo es " + id);
        return id;

    }

    /**
     * Metodo que inserta un objetivo de director que no fue cumplido
     *
     * @param idobj id del objetivo que no se cumplio
     * @param ced id de la cedula
     * @return id del nuevo registro
     */
    public static int inserta_obdirector(int idobj, int ced) {
        int id = 0;
        Grid2 g = datosdirector(idobj);
        int t = Seleccion.calculatrimestre();
        int[] cal = banderas.trimrecorrido(t);
        ListaNodos.agregainsert("nombre", g.getNombre());
        ListaNodos.agregainsert("descripcion", g.getDescripcion());
        ListaNodos.agregainsert("comcol", g.getComcol());
        ListaNodos.agregainsert("comjefe", g.getComjefe());
        ListaNodos.agregainsert("objdir", g.getLiga());
        ListaNodos.agregainsert("resultado", g.getResultado());
        ListaNodos.agregainsert("cedula", ced);
        ListaNodos.agregainsert("estado", "En Revisión");
        ListaNodos.agregainsert("trimestre", cal[0]);
        ListaNodos.agregainsert("aregistro", cal[1]);
        in.insertanuevo(ListaNodos.conversion_inser(), "obdirector");
        id = in.getId();
        ListaNodos.borradoinser();
        System.out.println("El registro nuevo es " + id);
        return id;
    }

    /**
     * Metodo que inserta un objetivo de direccion que no se termino el
     * trimestre pasado
     *
     * @param idobj id del objetivo anterior
     * @return id del nuevo objetivo
     */
    public static int inserta_obdir(int idobj) {
        int id = 0;
        Grid g = datosdir(idobj);
        int cal[] = banderas.trimrecorrido(Seleccion.calculatrimestre());
        ListaNodos.agregainsert("nombre", g.getNombre());
        ListaNodos.agregainsert("descripcion", g.getDescripcion());
        ListaNodos.agregainsert("idtac", g.getLigav());
        ListaNodos.agregainsert("resultado", g.getRes());
        ListaNodos.agregainsert("estado", "En Revisión");
        ListaNodos.agregainsert("trimestre", cal[0]);
        ListaNodos.agregainsert("direccion", g.getLogro());
        ListaNodos.agregainsert("aregistro", cal[1]);
        in.insertanuevo(ListaNodos.conversion_inser(), "objdir");
        id = in.getId();
        ListaNodos.borradoinser();
        System.out.println("El registro nuevo es " + id);
        return id;
    }

    /**
     * Metodo que obtiene los datos de un objetivo no cumplido
     *
     * @param id id del objetivo
     * @return Objeto Grid 2 con los datos de objetivo
     * @see Grid2
     */
    public static Grid2 datoscol(int id) {
        Grid2 g = new Grid2();
        String sql = "SELECT nombre,descripcion,objefe,comcol,comjefe,resultado from objcol where id=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                g.setNombre(rs.getString(1));
                g.setDescripcion(rs.getString(2));
                g.setLiga(rs.getInt(3));
                g.setComcol(rs.getString(4));
                g.setComjefe(rs.getString(5));
                g.setResultado(rs.getString(6));
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return g;
    }

    /**
     * Metodo que obtiene los datos de un objetivo de mando medio no cumplido
     *
     * @param id id del objetivo no cumplido
     * @return Objeto Grid2 con los datos del objetivo
     * @see Grid2
     */
    public static Grid2 datosmm(int id) {
        Grid2 g = new Grid2();
        String sql = "SELECT nombre,descripcion,objdir,comcol,comjefe,resultado from objmm where id=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                g.setNombre(rs.getString(1));
                g.setDescripcion(rs.getString(2));
                g.setLiga(rs.getInt(3));
                g.setComcol(rs.getString(4));
                g.setComjefe(rs.getString(5));
                g.setResultado(rs.getString(6));
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
            return g;
        }
    }

    /**
     * Metodo que obtiene los datos de un objetivo de director que no fue
     * cumplido
     *
     * @param id id el objetivo no cumplido
     * @return Objeto Grid2 con los datos del objetivo
     */
    public static Grid2 datosdirector(int id) {
        Grid2 g = new Grid2();
        String sql = "SELECT nombre,descripcion,objdir,comcol,comjefe,resultado from obdirector where id=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                g.setNombre(rs.getString(1));
                g.setDescripcion(rs.getString(2));
                g.setLiga(rs.getInt(3));
                g.setComcol(rs.getString(4));
                g.setComjefe(rs.getString(5));
                g.setResultado(rs.getString(6));
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return g;
    }

    /**
     * Metodo que obtiene los datos de un objetivo de direccion no cumplido
     *
     * @param id id del objetivo de direccion
     * @return Objeto Grid que tiene los datos de el objetivo
     * @see Grid
     */
    public static Grid datosdir(int id) {
        System.out.println("datosdir: el dato para la seleccion es=" + id);
        Grid g = new Grid();
        String sql = "SELECT nombre,descripcion,idtac,resultado,direccion from objdir where idobjdir=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                g.setNombre(rs.getString(1));
                g.setDescripcion(rs.getString(2));
                g.setLigav(rs.getInt(3));
                g.setRes(rs.getString(4));
                g.setLogro(rs.getInt(5));
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return g;
    }

    /**
     * Metodo que obtiene si el estatus del campo cal de la cedula
     *
     * @param cedula id de la cedula a revisar
     * @return estado de la cedula donde 0=sin calificar,1=a revision, 2
     * =revisado y 3=extraordinario
     */
    public static int calificado(int cedula) {

        int total = 0;
        String sql = "select cal from cedula where id=?";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }

        return total;
    }

    /**
     * Metodo que obtiene si el estatus del campo cal de la cedula
     *
     * @param cedula id de la cedula a revisar
     * @return estado de la cedula donde 0=sin calificar,1=a revision, 2
     * =revisado y 3=extraordinario
     */
    public static int calificadoB(int cedula) {

        int total = 0;
        String sql = "select calob from cedula where id=?";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }

        return total;
    }

    /**
     * Metodo que cambia la bandera cal de la cedula a 1
     *
     * @param ced id de la cedula
     */
    public static void abrecal(int ced) {
        ListaNodos.agregacam("cal", 1);
        c.setCond("id", ced);
        c.actualiza(ListaNodos.conversion_upd(), "cedula");
        ListaNodos.borradoact();
    }

    /**
     * Método que retorna a cero el valor de cal en la cédula
     *
     * @param ced id de la cédula.
     */
    public static void cierracal(int ced) {
        ListaNodos.agregacam("cal", 0);
        c.setCond("id", ced);
        c.actualiza(ListaNodos.conversion_upd(), "cedula");
        ListaNodos.borradoact();
    }

    /**
     * Metodo que cambia la bandera cal de la cedula a 1
     *
     * @param ced id de la cedula
     */
    public static void abrecalob(int ced) {
        ListaNodos.agregacam("calob", 1);
        c.setCond("id", ced);
        c.actualiza(ListaNodos.conversion_upd(), "cedula");
        ListaNodos.borradoact();
    }

    /**
     * Método que retorna a cero el valor de cal en la cédula
     *
     * @param ced id de la cédula.
     */
    public static void cierracalob(int ced) {
        ListaNodos.agregacam("calob", 0);
        c.setCond("id", ced);
        c.actualiza(ListaNodos.conversion_upd(), "cedula");
        ListaNodos.borradoact();
    }

    /**
     * método que registra el avance de la dirección en la tabla hdireccion
     *
     * @param dir id de la dirección
     */
    public static void HDireccion(int dir,int trim,int year) {
        //java.util.Date n = new java.util.Date();
        //int trim = Seleccion.calculatrimestre();
        System.out.println("Fui llamado con valor "+dir+"||"+trim+"||"+year);
        int total=Seleccion.avanzexdireccion(dir, trim, year);
        System.out.println("el total a registrar es "+total);
        ListaNodos.agregainsert("year", year);
        ListaNodos.agregainsert("trimestre", trim);
        ListaNodos.agregainsert("direccion", dir);
        ListaNodos.agregainsert("total", total);
        in.insertanuevo(ListaNodos.conversion_inser(), "hdireccion");
        ListaNodos.borradoinser();

    }

    /**
     * método que registra el avance de la cédula de un colaborador
     *
     * @param cedula id de la cédula
     * @param total valor acumulado de su cédula.
     */

    public static void HCedulas(int cedula, int total) {
        java.util.Date n = new java.util.Date();
        int trim = Seleccion.calculatrimestre();
        ListaNodos.agregainsert("year", n.getYear()+1900);
        ListaNodos.agregainsert("trimestre", trim);
        System.out.println("La cedula "+cedula+" tiene avance de "+total);
        ListaNodos.agregainsert("cedula", cedula);
        ListaNodos.agregainsert("total", total);
        in.insertanuevo(ListaNodos.conversion_inser(), "hcedula");
        ListaNodos.borradoinser();
    }

    /**
     * Método que registra el avance de una táctica en un trimestre dado en la
     * tabla htacticas
     *
     * @param id id de la táctica
     * @param dire id de la dirección
     */
    public static void HTacticas(int id,int trim,int year) {
        //java.util.Date n = new java.util.Date();
        //int trim = Seleccion.calculatrimestre();
        ListaNodos.agregainsert("year", year);
        ListaNodos.agregainsert("trimestre", trim);
        ListaNodos.agregainsert("tactica", id);
        ListaNodos.agregainsert("total", cumpletac(id, trim, year));
        in.insertanuevo(ListaNodos.conversion_inser(), "htacticas");
        ListaNodos.borradoinser();

    }

    /**
     * Método que registra el avance de un colaborador en base a su cédula
     *
     * @param cedula id de la cédula a revisar.
     */

    public static void regavance(int cedula) {
        int nivel = Seleccion.nivelxced(cedula);
        switch (nivel) {
            case 2:
                HCedulas(cedula, avancecedulaD(cedula));
                break;
            case 3:
                HCedulas(cedula, avancecedulaMM(cedula));
                break;
            case 4:
                HCedulas(cedula, avancecedulaCol(cedula));
                break;
        }
    }

    /**
     * Método que revisa el avance de la cédula de un director sumando sus
     * logros
     *
     * @param cedula id de la cédula del director
     * @return promedio de los objetivos que tiene registrados y calificados
     */
    public static int avancecedulaD(int cedula) {
        int ret = 0;
        java.util.Date d = new Date();
        String sql = "select SUM(logro) from obdirector where (estado='Terminado' or estado='No Terminado') and cedula=? and trimestre=? and aregistro=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, Seleccion.calculatrimestre());
            pst.setInt(3, d.getYear() + 1900);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Método que retorna el avance de una cédula de mando medio
     *
     * @param cedula id de la cédula
     * @return promedio de los objetivos que tiene registrados y calificados
     */
    public static int avancecedulaMM(int cedula) {
        int ret = 0;
        java.util.Date d = new Date();
        String sql = "select SUM(logro) from objmm  where (estado='Terminado' or estado='No Terminado') and cedula=? and trimestre=? and aregistro=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
           pst.setInt(2, Seleccion.calculatrimestre());
            pst.setInt(3, d.getYear() + 1900);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Método que retorna el avance de una cédula de colaborador
     *
     * @param cedula id de la cédula
     * @return promedio de los objetivos que tiene registrados y calificados
     */
    public static int avancecedulaCol(int cedula) {
        int ret = 0;
        java.util.Date d = new Date();
        String sql = "select SUM(logro) from objcol where (estado='Terminado' or estado='No Terminado') and cedula=? and trimestre=? and aregistro=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, Seleccion.calculatrimestre());
            pst.setInt(3, d.getYear() + 1900);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Método que selecciona un registro de la tabla hdireccion
     *
     * @param dir id de la dirección
     * @param year id del año
     * @param trim numero de trimestre
     * @return
     */

    public static int VHDireccion(int dir, int year, int trim) {
        int res = 0;
        String sql = "select total from hdireccion where direccion=? and year=? and trim=? ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            pst.setInt(2, year);
            pst.setInt(3, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                res = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return res;
    }

    /**
     * Selecciona el valor obtenido del avance en la tabla htacticas
     *
     * @param tac id de la táctica
     * @param year año de la consulta
     * @param trim trimestre a elegir
     * @return
     */

    public static int VHTacticas(int tac, int year, int trim) {
        int res = 0;
        String sql = "select total from htacticas where tactica=? and year=? and trim=? ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tac);
            pst.setInt(2, year);
            pst.setInt(3, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                res = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return res;
    }

    /**
     * Método que revisa un registro de la tabla hcedula
     *
     * @param ced id de la cédula
     * @param year año
     * @param trim trimestre
     * @return el promedio de avance de el trimestre en el año.
     */

    public static int VHCedulas(int ced, int year, int trim) {
        int res = 0;
        String sql = "select total from hcedula where cedula=? and year=? and trim=? ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, ced);
            pst.setInt(2, year);
            pst.setInt(3, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                res = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return res;
    }
//Promedio anual de una cedula

    public static int promedioCedula(int year, int ced) {
        int prom = 0;
        String sql = "select TRUNCATE(avg(total),0) from htacticas where cedula=? and year=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, ced);
            pst.setInt(2, year);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                prom = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return prom;
    }
//promedio anual de plan e base a tactica

    public static int promedioTactica(int year, int tac) {
        int prom = 0;
        String sql = "select TRUNCATE(avg(total),0) from htacticas where tactica=? and year=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tac);
            pst.setInt(2, year);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                prom = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return prom;
    }
//promedio anual de los objetivos de direccion

    public static int promedioObDir(int year, int dir) {
        int prom = 0;
        String sql = "select TRUNCATE(avg(total),0) from htacticas where direccion=? and year=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            pst.setInt(2, year);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                prom = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return prom;
    }
//lista de objetivos de direccion por trimestre

    public static List<Grid> obdireccionxtrim(int dir, int trim, int areg) {
        List<Grid> lista = new ArrayList<Grid>();
        String sql = "select idobjdir,nombre,descripcion,idtac,peso,cumple,resultado,logro from objdir where and direccion=? and aregistro=? and trimestre=? and estado !='Anulado' and estado!='Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            pst.setInt(2, areg);
            pst.setInt(3, trim);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                Grid g = new Grid();
                g.setId(rs.getInt(1));
                g.setNombre(rs.getString(2));
                g.setDescripcion(rs.getString(3));
                g.setLigav(rs.getInt(4));
                g.setPeso(rs.getInt(5));
                g.setCumple(rs.getInt(6));
                g.setRes(rs.getString(7));
                g.setLogro(rs.getInt(8));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return lista;
    }
    //Revivir

    public static void revtac(int tac) {
        //java.util.Date n=new java.util.Date();
        ListaNodos.agregacam("estado", "En Revisión");
        c.setCond("idtac", tac);
        c.actualiza(ListaNodos.conversion_upd(), "tactica");
        ListaNodos.borradoact();
        int arr[] = objDirxtac(tac);
        for (int i = 0; i < arr.length; i++) {
            revobdir(arr[i]);
        }

    }

    public static void revobdir(int id) {
        java.util.Date n = new java.util.Date();
        ListaNodos.agregacam("estado", "En Revisión");
        ListaNodos.agregacam("aregistro", (n.getYear() + 1900));
        ListaNodos.agregacam("trimestre", Seleccion.calculatrimestre());
        c.setCond("idobjdir", id);
        c.actualiza(ListaNodos.conversion_upd(), "objdir");
        ListaNodos.borradoact();
        int arr[];

        arr = objcolxdir(id);
        for (int i = 0; i < arr.length; i++) {
            revobcol(arr[i]);
        }
        arr = objdirexdir(id);
        for (int i = 0; i < arr.length; i++) {
            revoobdirec(arr[i]);

        }
        arr = objmmxdir(id);
        for (int i = 0; i < arr.length; i++) {
            revobmm(arr[i]);

        }
    }

    public static void revoobdirec(int id) {
        java.util.Date n = new java.util.Date();
        ListaNodos.agregacam("estado", "En Revisión");
        ListaNodos.agregacam("aregistro", (n.getYear() + 1900));
        ListaNodos.agregacam("trimestre", Seleccion.calculatrimestre());
        c.setCond("id", id);
        c.actualiza(ListaNodos.conversion_upd(), "obdirector");
        ListaNodos.borradoact();
    }

    public static void revobmm(int id) {
        java.util.Date n = new java.util.Date();
        ListaNodos.agregacam("estado", "En Revisión");
        ListaNodos.agregacam("aregistro", (n.getYear() + 1900));
        ListaNodos.agregacam("trimestre", Seleccion.calculatrimestre());
        c.setCond("id", id);
        c.actualiza(ListaNodos.conversion_upd(), "objmm");
        ListaNodos.borradoact();
    }

    public static void revobcol(int id) {
        java.util.Date n = new java.util.Date();
        ListaNodos.agregacam("estado", "En Revisión");
        ListaNodos.agregacam("aregistro", (n.getYear() + 1900));
        ListaNodos.agregacam("trimestre", Seleccion.calculatrimestre());
        c.setCond("id", id);
        c.actualiza(ListaNodos.conversion_upd(), "objmm");
        ListaNodos.borradoact();
    }

    public static int totalobjdir(int idtac) {
        int total = 0;
        String sql = "select count(a.id) from obdirector a,objdir b where b.idobjdir=a.objdir and b.idobjdir=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idtac);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;

    }

    public static int[] objDirxtac(int tac) {
        int arr[] = new int[totalobjdir(tac)];
        java.util.Date n = new java.util.Date();
        String sql = "select id from objdir where idtac=? and estado='Anulado';";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tac);

            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                arr[i] = rs.getInt(1);
                System.out.println("El valor es " + arr[i]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return arr;
    }

    public static int[] objcolxdir(int dir) {
        int arr[] = new int[totalobjcol(dir)];
        java.util.Date n = new java.util.Date();
        String sql = "select id from objcol where objdir=? and estado='Anulado';";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);

            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                arr[i] = rs.getInt(1);
                System.out.println("El valor es " + arr[i]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return arr;
    }

    public static int[] objmmxdir(int dir) {
        int arr[] = new int[totalobjmm(dir)];
        java.util.Date n = new java.util.Date();
        String sql = "select id from objmm where objdir=? and estado='Anulado';";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);

            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                arr[i] = rs.getInt(1);
                System.out.println("El valor es " + arr[i]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return arr;
    }

    public static int[] objdirexdir(int dir) {
        int arr[] = new int[totalobjdire(dir)];
        java.util.Date n = new java.util.Date();
        String sql = "select id from obdirector where objdir=? and aregistro=? and trimestre=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            pst.setInt(2, (n.getYear() + 1900));
            pst.setInt(3, Seleccion.calculatrimestre());
            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                arr[i] = rs.getInt(1);
                System.out.println("El valor es " + arr[i]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return arr;
    }

    /**
     * Método que devuelve el total de objetivos de dirección que se tienen
     *
     * @param iddir id de objetivo de dirección
     * @return total de objetivos asociados al id del objetivo de dirección
     */
    public static int totalobjcol(int iddir) {
        int total = 0;
        String sql = "select count(a.id) from objcol a,objdir b,objmm c where b.idobjdir=c.objdir and a.objefe=c.id and b.idobjdir=? and a.estado='Anulado';";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, iddir);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;

    }

    /**
     * Método que retorna el total de objetivos de mando medio que tienen
     * relación con un objetivo de dirección
     *
     * @param iddir id del objetivo de dirección
     * @return numero de objetivos asociados.
     */
    public static int totalobjmm(int iddir) {
        int total = 0;
        String sql = "select count(a.id) from objmm a,objdir b where b.idobjdir=a.objdir and b.idobjdir=? and a.estado='Anulado';";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, iddir);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;

    }

    /**
     * Numero de objetivos de director asociados con el id de un objetivo de
     * dirección
     *
     * @param iddir id del objetivo de dirección
     * @return numero de objetivos de director asociados al obj de dirección
     */
    public static int totalobjdire(int iddir) {
        int total = 0;
        String sql = "select count(a.id) from obdirector a,objdir b where b.idobjdir=a.objdir and b.idobjdir=? and a.estado='Anulado';";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, iddir);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Método que selecciona el numero de personas que ya calificaron cédula en
     * una dirección
     *
     * @param dir id de la dirección
     * @return numero de personas con calificación.
     */
    public static int calxdire(int dir) {
        int total = 0;
        String sql = "select count(a.cal) from cedula a, dependencia b where a.puesto=b.idpuesto and b.dep=? and a.cal=2;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Método que obtiene el numero de usuarios de una dirección
     *
     * @param dir id de la dirección
     * @return numero de dependientes de la dirección
     */
    public static int totalxdire(int dir) {
        int total = 0;
        String sql = "select count(a.id) from usuarios a,dependencia b where a.puesto=b.idpuesto and b.dep=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Método que revive objetivos depende de su nivel
     *
     * @param id id del objetivo
     * @param ced id de la cédula
     */
    public static void Revive_obj(int id, int ced) {
        int nivel = Seleccion.nivelxced(ced);
        //java.util.Date n=new java.util.Date();    

        switch (nivel) {
            case 2:
                revoobdirec(id);
                break;

            case 3:
                revobmm(id);
                break;

            case 4:
                revobcol(id);
                break;
        }
    }

    /**
     * Lista de cedulas asociadas de un director que debe aprobar
     *
     * @param puesto id del puesto
     * @return Lista de cedulas con el id de cedula y nombre de propietario
     */
    public static List<Grid3> revisarcal(int dir) {
        // String[][] datos=new String[totalsubxpuestorev(puesto)+1][2];
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select b.id,c.nombre from dependencia a,cedula b,usuarios c where b.puesto=c.puesto and a.idpuesto=b.puesto and a.dep=? and b.cal=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                g.setNombre(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return lista;
    }

    public static void aceptacal(int ced) {
        ListaNodos.agregacam("cal", 2);
        c.setCond("id", ced);
        c.actualiza(ListaNodos.conversion_upd(), "cedula");
        ListaNodos.borradoact();
    }

    public static void extempcal(int ced) {
        ListaNodos.agregacam("cal", 3);
        c.setCond("id", ced);
        c.actualiza(ListaNodos.conversion_upd(), "cedula");
        ListaNodos.borradoact();
    }

    /**
     * Método que obtiene los objetivos de un colaborador en base a su cédula y
     * el trimestre
     *
     * @param cedula id de la cédula
     * @param trim numero del trimestre
     * @return Lista de tipo Grid2 con los datos de los objetivos de colaborador
     * @see Grid2
     */
    public static List<Grid2> calificadosL(int cedula, int trim, int are) {
        List<Grid2> lista = new ArrayList<Grid2>();
        int nivel = Seleccion.nivelxced(cedula);
        String sql = "";
        switch (nivel) {
            case 2:
                sql = "select id,nombre,descripcion,objdir,peso,cumple,resultado,logro,comcol,comjefe,estado from obdirector where cedula=? and estado='Terminado' or estado='No Terminado' and trimestre=? and aregistro=?";
                break;
            case 3:
                sql = "select id,nombre,descripcion,objdir,peso,cumple,resultado,logro,comcol,comjefe,estado from objmm where cedula=? and estado='Terminado' or estado='No Terminado' and trimestre=? and aregistro=?";
                break;
            case 4:
                sql = "select id,nombre,descripcion,objefe,peso,cumple,resultado,logro,comcol,comjefe,estado from objcol where cedula=? and estado='Terminado' or estado='No Terminado' and trimestre=? and aregistro=?";
                break;
        }

        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid2 d = new Grid2();
                d.setId(rs.getInt(1));
                d.setNombre(rs.getString(2));
                d.setDescripcion(rs.getString(3));
                d.setLiga(rs.getInt(4));
                d.setPeso(rs.getInt(5));
                d.setCumple(rs.getInt(6));
                d.setResultado(rs.getString(7));
                d.setLogro(rs.getInt(8));
                d.setComcol(rs.getString(9));
                d.setComjefe(rs.getString(10));

                lista.add(d);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return lista;
    }

    /**
     * Método que revisa si los objetivos de dirección pueden ser calificados y
     * abrir la estadística
     *
     * @return true si todas las direcciones ya calificaron.
     */
    public static boolean activarcalplan() {
        boolean b = true;
        int dir[] = Seleccion.direccionesemp();
        for (int i = 0; i < dir.length; i++) {
            int j = dir[i];
            if (activarcaldire(j) == false) {
                b = false;
                break;
            }
        }
        return b;
    }

    /**
     * Método booleano que revisa si todos los que pertenecen a una dirección ya
     * calificaron objetivos
     *
     * @param dir id de la dirección
     * @return true si todos calificaron.
     */
    public static boolean activarcaldire(int dir) {
        int total = totalxdire(dir);
        int cal = calxdire(dir);
        boolean r = false;
        if (cal == total) {
            r = true;
        } else {
            r = false;
        }
        return r;
    }

    /**
     * Método que registra el cumplimiento de una táctica en base a su id y un
     * id de dirección asociado.
     *
     * @param idtac id de la táctica
     * @param dir id de la dirección
     * @param trim trimestre
     * @param are año de registro
     * @return entero con el promedio de cumplimiento de la táctica en base a
     * sus objetivos asociados y calificados
     */
    public static int cumpletac(int idtac, int trim, int are) {
        int res = 0;
        String sql = "select truncate(avg(a.cumple),0) from objdir a,tactica b where a.idtac=b.idtac and a.idtac=? and a.trimestre=? and (a.estado='No Terminado' or a.estado='Terminado') and aregistro=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idtac);
            pst.setInt(2, trim);
            //pst.setInt(3, dir);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                res = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println("El resultado fue "+idtac+" de "+res);
        cumpletac(idtac, res);
        calificartac(idtac);
        return res;
    }

    /**
     * Método que cambia el valor del campo logro en base al id de táctica
     *
     * @param id id de táctica
     */
    public static void calificartac(int id) {
        ListaNodos.agregacamexp("logro", "(TRUNCATE(peso*cumple/100,0))");
        c.actualiza(ListaNodos.conversion_upd(), "tactica");
        c.setCond("idtac", id);
        ListaNodos.borradoact();

    }

    /**
     * Método que cambia el estado de un objetivo
     *
     * @param id id de la táctica
     * @param cumple cantidad de cumplimiento
     */
    public static void cumpletac(int id, int cumple) {
        if (cumple == 100) {
            ListaNodos.agregacam("estado", "Terminado");
            c.setCond("idtac", id);
            c.actualiza(ListaNodos.conversion_upd(), "tactica");
            
            ListaNodos.borradoact();
        } else {
            ListaNodos.agregacam("estado", "No Terminado");
            c.setCond("idtac", id);
            c.actualiza(ListaNodos.conversion_upd(), "tactica");
            
            ListaNodos.borradoact();
        }

    }
}
